﻿#include<iostream>
using namespace std;
// 类模版
template<typename T>
class Stack
{
public:
	Stack(size_t capacity = 4)
	{
		_array = new T[capacity];
		_capacity = capacity;
		_size = 0;
	}
	void Push(const T& data);
private:
	T* _array;
	size_t _capacity;
	size_t _size;
};
// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误，具体原因后面会讲
template<class T>
void Stack<T>::Push(const T& data)
{
	// 扩容
	_array[_size] = data;
	++_size;
}
int main()
{
	Stack<int> st1;// int
	Stack<double> st2; // double
	return 0;
}
//#include<iostream>
//using namespace std;
//template<typename T1, typename T2>
//class t
//{
//	// 类内成员定义
//};
////// 专门处理int的加法函数
//int Add(int left, int right)
//{
//	return left + right;
//}
//
//// 通用加法函数
//template<class T1, class T2>
//T1 Add(T1 left, T2 right)
//{
//	return left + right;
//}
//
//void Test()
//{
//	Add(1, 2);// 与非函数模板类型完全匹配，不需要函数模板实例化
//	Add(1, 2.0);// 模板函数可以生成更加匹配的版本，编译器根据实参生成更加匹配的
//}
//// 专门处理int的加法函数
//int Add(int left, int right)
//{
//	return left + right;
//}
//
//// 通用加法函数
//template<class T>
//T Add(T left, T right)
//{
//	return left + right;
//}
//
//void Test()
//{
//	Add(1, 2);       // 与非模板函数匹配，编译器不需要特化
//	Add<int>(1, 2);  // 调用编译器特化的Add版本
//}
////template<class T>
//T* func(size_t n)
//{
//	return new T[n];
//}
//template<class T>
//T Add(const T& left, const T& right)
//{
//	return left + right;
//}
//int main()
//{
//	int a = 2, b = 3;
//	double c = 4.53, d = 2.54;
//	//指定参数为int类型（形参）
//	cout << Add<int>(a, c) << endl;
//	//指定参数为double类型（形参）
//	cout << Add<double>(b, d) << endl;
//	return 0;
//}
//template<class T1,class T2>
//T1 Add(const T1& left, const T2& right)
//{
//	return left + right;
//}
//int main()
//{
//	int a = 3, b = 2;
//	double c = 3.024, d = 4.501;
//	cout << Add(a, b) << endl;
//	cout << Add(c, d) << endl;
//	cout << Add(a, (int)c) << endl;
//	cout << Add((double)a, c) << endl;
//
//	return 0;
//}
////需要几个类型就写几个参数
//template<class T>
//void Swap(T& left, T& right)
//{
//	T temp = left;
//	left = right;
//	right = temp;
//}
//int main()
//{
//	int a = 2, b = 3;
//	double c = 3.0, d = 4.5;
//	//cin >> a >> b >> c >> d;
//	//会报错
//	//Swap(a, c);
//	//解决办法1
//	Swap(a, b);
//	//解决办法2(显式实例化）
//	//但这样会报错有精度问题
//	Swap<int>(a, c);
//	//或者
//	Swap<double>(a, c);
//	//解决办法3
//	Swap(a, (int)c);
//	//或者
//	Swap((double)b, d);
//	return 0;
//}
//int main()
//{
//	//交换两个整型
//	int a, b;
//	cin >> a >> b;
//	Swap(a, b);
//	cout << a << " " << b << endl;
//	//交换两个浮点型
//	double c, d;
//	cin >> c >> d;
//	Swap(c, d);
//	cout << c << " " << d << endl;
//	//交换两个字符型
//	char e, f;
//	cin >> e >> f;
//	Swap(e, f);
//	cout << e << " " << f << endl;
//	return 0;
//}
////交换两个整型
//void Swap(int& a, int& b)
//{
//	int c = a;
//	a = b;
//	b = c;
//}
////交换两个浮点型
//void Swap(double& a, double& b)
//{
//	double c = a;
//	a = b;
//	b = c;
//}